package utils;

import javax.swing.table.TableModel;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

public class CsvReportUtil {

    /**
     * 生成CSV报告
     * @param file 要保存的文件
     * @param tableModel 表格模型
     * @param filter 过滤条件 ("全部", "被绕过", "待确认", "可防御")
     * @param removeDuplicates 是否去重
     * @throws IOException 文件写入异常
     */
    public static void generateCsvReport(
            File file,
            TableModel tableModel,
            String filter,
            boolean removeDuplicates) throws IOException {

        try (FileWriter writer = new FileWriter(file)) {
            StringBuilder csvContent = new StringBuilder();

            // 写入表头
            for (int i = 0; i < tableModel.getColumnCount(); i++) {
                if (i > 0) {
                    csvContent.append(",");
                }
                csvContent.append("\"").append(escapeCsvField(tableModel.getColumnName(i))).append("\"");
            }
            csvContent.append("\n");

            // 写入表格内容
            // 用于跟踪已处理的URL（去重用）
            java.util.Set<String> processedUrls = new java.util.HashSet<>();
            
            for (int row = 0; row < tableModel.getRowCount(); row++) {
                // 根据过滤条件筛选行
                if (!shouldIncludeRow(tableModel, row, filter)) {
                    continue;
                }
                
                // 获取URL用于去重判断
                String url = (String) tableModel.getValueAt(row, 2); // URL列
                
                // 如果需要去重且URL已处理过，则跳过
                if (removeDuplicates && url != null && !processedUrls.add(url)) {
                    continue;
                }
                
                for (int col = 0; col < tableModel.getColumnCount(); col++) {
                    if (col > 0) {
                        csvContent.append(",");
                    }

                    Object value = tableModel.getValueAt(row, col);
                    String cellValue = (value == null) ? "" : value.toString();
                    csvContent.append("\"").append(escapeCsvField(cellValue)).append("\"");
                }
                csvContent.append("\n");
            }

            writer.write(csvContent.toString());
        }
    }

    /**
     * 转义CSV字段中的特殊字符
     * @param field 字段值
     * @return 转义后的字段值
     */
    private static String escapeCsvField(String field) {
        if (field == null) {
            return "";
        }
        // 如果字段包含引号、逗号或换行符，则需要转义
        if (field.contains("\"") || field.contains(",") || field.contains("\n")) {
            // 将双引号转义为两个双引号
            return field.replace("\"", "\"\"");
        }
        return field;
    }
    
    /**
     * 判断是否应该包含某一行
     * @param tableModel 表格模型
     * @param row 行索引
     * @param filter 过滤条件
     * @return 是否应该包含该行
     */
    private static boolean shouldIncludeRow(TableModel tableModel, int row, String filter) {
        if ("全部".equals(filter)) {
            return true;
        }
        
        // 获取低权限结果和未授权结果列的值
        String lowPrivilegeResult = (String) tableModel.getValueAt(row, 6);  // 低权限结果列
        String unauthorizedResult = (String) tableModel.getValueAt(row, 7);  // 未授权结果列
        
        // 根据过滤条件判断是否应该包含该行
        return switch (filter) {
            case "被绕过" -> "被绕过".equals(lowPrivilegeResult) || "被绕过".equals(unauthorizedResult);
            case "待确认" -> "待确认".equals(lowPrivilegeResult) || "待确认".equals(unauthorizedResult);
            case "可防御" -> "可防御".equals(lowPrivilegeResult) || "可防御".equals(unauthorizedResult);
            default -> true;
        };
    }
}
